package com.vvv.designpattern.bridge.abst;

import com.vvv.designpattern.bridge.function.RegisterLoginFuncInterface;
import com.vvv.designpattern.pojo.UserInfo;

import javax.servlet.http.HttpServletRequest;

/**
 * @author vvv
 * @date 2023-11-16 15 00
 * discription 左路抽象类，也就是直接给Client调用的类
 * 我们发现这里定义的方法和右路接口(RegisterLoginFuncInterface)定义的一模一样，
 * 这是没办法的，桥接模式中的“抽象与实现的分离，解耦”的代价就是这里.
 */
public abstract class AbstractRegisterLoginComponent {

    /**
     * 桥接模式的桥就是这个
     */
    protected RegisterLoginFuncInterface funcInterface;

    public AbstractRegisterLoginComponent(RegisterLoginFuncInterface funcInterface) {
        vaildate(funcInterface);
        this.funcInterface = funcInterface;
    }

    protected final void vaildate(RegisterLoginFuncInterface funcInterface) {
        if (funcInterface == null) {
            throw new UnsupportedOperationException("Unknown register / login function type");
        }
    }

    /**
     * 普通登录
     *
     * @param account
     * @param password
     * @return
     */
    public abstract String login(String account, String password);

    /**
     * 普通注册
     *
     * @param userInfo
     * @return
     */
    public abstract String register(UserInfo userInfo);

    /**
     * 检查用户是否存在
     * @param username
     * @return
     */
    public abstract boolean checkUserExists(String username);

    /**
     * 第三方登录接口
     * @param request
     * @return
     */
    public abstract String login3rd(HttpServletRequest request);

}
